package com.wh1200.xmlless.test.dao;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

import com.wh1200.mybatis.xmlless.XmlLessMapper;
import com.wh1200.mybatis.xmlless.annotations.JsonResult;
import com.wh1200.mybatis.xmlless.annotations.SelectedProperties;
import com.wh1200.mybatis.xmlless.annotations.XmllessMethod;
import com.wh1200.xmlless.test.form.QueryForm;
import com.wh1200.xmlless.test.model.Student;
import com.wh1200.xmlless.test.model.StudentDetail;
import com.wh1200.xmlless.test.model.StudentState;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * Created by 吴昊 on 2018-12-12.
 *
 * @author 吴昊
 * @version 0.0.4
 * @date 2023-08-12
 * @since 0.0.4
 */
@Mapper
public interface StudentJavaDAO extends XmlLessMapper<Student> {

  /**
   * 统计数量
   */
  int count();

  /**
   * 根据id删除
   *
   * @param id id
   */
  void deleteById(@Param("id") String id);

  /**
   * 根据id列表删除
   *
   * @param ids id列表
   */
  @XmllessMethod(conditions = {"id in ids", "name != 'aaffwwff'"})
  void deleteByIds(@Param("ids") List<String> ids);

  /**
   * 根据名称删除
   *
   * @param name 名称
   */
  void deleteByName(@Param("name") String name);

  /**
   * 判断指定id的数据是否存在
   *
   * @param id 指定的id
   * @return 存在返回true，否则返回false
   */
  boolean existsById(@Param("id") String id);

  /**
   * 指定名称的数据是否存在
   *
   * @param name 名称
   * @return 存在返回true，否则返回false
   */
  boolean existsByName(@Param("name") String name);

  /**
   * 查询所有数据
   *
   * @return 所有数据
   */
  List<Student> findAll();

  /**
   * 按名称和科目id分页查询所有数据
   *
   * @param name      名称
   * @param subjectId 科目id
   * @param page      分页对象
   * @return 符合条件的对象列表
   */
  @XmllessMethod(conditions = {"name", "subjectId"})
  Page<Student> findAllPage(String name, Integer subjectId, @Param("pageable") Pageable page);


  /**
   * 分页查询所有数据
   *
   * @param pageable 分页对象
   * @return 分页后的对象列表
   */
  @XmllessMethod
  Page<Student> findAllPageable(@Param("pageable") Pageable pageable);

  /**
   * 根据年龄和名称查询
   *
   * @param name 名称
   * @param age  年龄
   * @return 符合条件的对象列表
   */
  @XmllessMethod(conditions = {"name", "age"})
  List<Student> findByAge(@Param("age") int age, @Param("name") String name);

  /**
   * @param min 最小年龄
   * @param max 最大年龄
   * @return 符合条件的对象列表
   */
  List<Student> findByAgeBetween(Integer min, Integer max);

  /**
   * @param min 最小年龄
   * @param max 最大年龄
   * @return 符合条件的对象列表
   */
  List<Student> findByAgeBetweenMinAndMax(Integer min, Integer max);

  /**
   * 按年龄区间查询并按生日排序
   *
   * @param min 最小年龄
   * @param max 最大年龄
   * @return 符合条件的对象列表
   */
  List<Student> findByAgeBetweenMinAndMaxOrderByBirthday(@Param("min") int min, @Param("max") int max);

  /**
   * 查询年龄大于等于指定值的对象列表
   *
   * @param age 年龄
   * @return 符合条件的对象列表
   */
  List<Student> findByAgeGte(@Param("age") int age);

  /**
   * 按生日查询学生列表
   *
   * @param date 生日
   * @return 符合条件的对象列表
   */
  @SelectedProperties(value = {"id", "name", "createTime", "birthday"})
  List<Student> findByBirthday(@Param("birthday") LocalDate date);

  /**
   * 按创建时间区间查询
   *
   * @param startTime 最小创建时间
   * @param endTime   最大创建时间
   * @return 符合条件的对象列表
   */
  List<Student> findByCreateTimeBetweenStartTimeAndEndTime(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

  /**
   * 查询已毕业的学生
   *
   * @return 符合条件的对象列表
   */
  List<Student> findByGraduatedEqTrue();

  /**
   * 根据id查询
   *
   * @param id id
   * @return 符合条件的对象
   */
  Student findById(@Param("id") String id);

  /**
   * @param form 查询条件对象
   * @return 符合条件的对象列表
   */
  List<Student> findByNameOrAge(QueryForm form);

  /**
   * 手机号码以指定字符串开头
   *
   * @param phoneNumber 手机号码
   * @return 符合条件的对象列表
   */
  List<Student> findByPhoneNumberLikeLeft(@Param("phoneNumber") String phoneNumber);

  /**
   * 手机号码以指定字符串结尾
   *
   * @param phoneNumber 手机号码
   * @return 符合条件的对象列表
   */
  List<Student> findByPhoneNumberLikeRight(@Param("phoneNumber") String phoneNumber);

  /**
   * 按状态查询
   *
   * @param state 状态列表
   * @return 符合条件的对象列表
   */
  List<Student> findByStateIn(@Param("state") List<StudentState> state);

  /**
   * 按科目id查询
   *
   * @param subjectId 科目id
   * @return 符合条件的对象列表
   */
  List<Student> findBySubjectId(@Param("subjectId") int subjectId);

  /**
   * 查询所有学生明细信息
   *
   * @return 学生明细信息列表
   */
  @JsonResult
  List<StudentDetail> findDetail();

  /**
   * 查询所有的id
   *
   * @return id列表
   */
  List<String> findId();

  /**
   * 新增学生
   *
   * @param student 学生对象
   */
  void save(Student student);

  /**
   * 批量保存
   *
   * @param list 对象列表
   */
  void saveAll(List<Student> list);

  /**
   * 保存或更新
   *
   * @param student 对象
   */
  void saveOrUpdate(Student student);

  /**
   * 批量保存或更新
   *
   * @param list 对象列表
   */
  void saveOrUpdateAll(List<Student> list);

  /**
   * 更新学生信息
   *
   * @param student 学生对象
   * @return 更新的记录数
   */
  int update(Student student);

  /**
   * 根据id更新名称
   *
   * @param name 名称
   * @param id   id
   * @return 更新的记录数
   */
  int updateNameById(@Param("name") String name, @Param("id") String id);

  /**
   * @param student 需要更新的对象
   * @return 更新的记录数
   */
  @XmllessMethod(includes = {"name", "phoneNumber"})
  int updatePartly(Student student);

}
